#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：Btcbf
@File ：btc破解.py
@IDE  ：PyCharm
@Author ：李涵彬
@Date ：2025/3/15 下午4:33
"""

import random
import os
from bit import Key
import time
from bit.format import bytes_to_wif
import multiprocessing

# 地址维护文件
fileBTC = "btcaddr.txt"

# 结果暂存
results = []

# 锁
lock = multiprocessing.Lock()


# 读取并验证文件中的地址
def seek():
	if not os.path.exists(fileBTC):
		print(f"{fileBTC} 文件不存在，请确保文件路径正确且文件存在。")
		return None
	with open(fileBTC, "r") as f:
		add = f.read().split()
		addbtc = set(add)
	return addbtc


# 随机生成 BTC 私钥（WIF 格式）
def mHash():
	# 生成 32 字节随机数据作为私钥
	private_key_bytes = os.urandom(32)
	# 转换为 WIF 格式
	private_key_wif = bytes_to_wif(private_key_bytes, compressed=True)
	return private_key_wif


# 单进程碰撞函数
def crack(addbtc):
	w = 0  # 匹配成功次数
	z = 0  # 总尝试次数
	start_time = time.time()
	local_results = []  # 每个进程自己的结果暂存
	while True:
		z += 1
		# 随机生成私钥
		PRIVATE_KEY = mHash()
		# 使用 bit 库生成地址
		try:
			key = Key(PRIVATE_KEY)
			btcadd = key.address  # P2PKH 地址
		except Exception as e:
			continue
		# 匹配地址
		if btcadd in addbtc:
			w += 1
			# 输出匹配结果
			print(f"\n匹配成功！第 {z} 次尝试")
			print(f"私钥: {PRIVATE_KEY}")
			print(f"地址: {btcadd}")
			# 暂存结果
			local_results.append((PRIVATE_KEY, btcadd))
		# 定期输出进度
		if z % 1000 == 0:
			elapsed_time = time.time() - start_time
			print(f"已尝试 {z} 次，耗时 {elapsed_time:.2f} 秒，匹配成功 {w} 次")
		# 每 10000 次将结果写入全局结果
		if z % 10000 == 0:
			with lock:
				results.extend(local_results)
			local_results = []


# 多进程主函数
def main():
	print("BTC 私钥助记词地址碰撞器启动...")
	addbtc = seek()
	if addbtc is None:
		return
	print(f"已加载 {len(addbtc)} 个目标地址，开始碰撞...")

	# 创建多个进程
	processes = []
	cpu_count = multiprocessing.cpu_count()
	for _ in range(cpu_count):  # 使用所有 CPU 核心
		p = multiprocessing.Process(target=crack, args=(addbtc,))
		p.start()
		processes.append(p)

	# 等待所有进程完成
	for p in processes:
		p.join()

	# 保存结果到文件
	with open("result.txt", "a") as f:
		for private_key, address in results:
			f.write(f"\nBTC PRIVATEKEY ======> {private_key}")
			f.write(f"\nAddressBTC =========> {address}")
	print("碰撞结束，结果已保存。")


if __name__ == "__main__":
	main()